package cc.yiueil.synergism;

import java.util.LinkedList;
import java.util.Queue;

/**
 * TaskQueue 实现一个线程安全的队列
 *
 * @author 弋孓 YIueil@163.com
 * @version 1.0
 * @date 2024/9/26 17:27
 */
public class ProductQueue<T> {
    private final Queue<T> productQueue = new LinkedList<>();

    public synchronized void addProduct(T o) {
        // 获取this锁
        productQueue.add(o);
        // 唤醒等待this锁的其他线程
        notifyAll();
    }

    public synchronized T getProduct() throws InterruptedException {
        // 获取this锁
        // 使用 while 而不是 if
        while (productQueue.isEmpty()) {
            // 等待, 释放this锁
            wait();
            // 被唤醒, 重新尝试获取this锁
        }
        return productQueue.remove();
    }
}
